package com.zb.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zb.entity.*;
import com.zb.mapper.ZjStoreMapper;
import com.zb.result.PageUtil;
import com.zb.service.*;
import com.zb.utils.RandomUtil;
import com.zb.vo.StoreListVo;
import com.zb.vo.StorePositionVo;
import com.zb.vo.StoreSelectVo;
import com.zb.vo.StoreVo;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * <p>
 * 仓库表 服务实现类
 * </p>
 *
 * @author WEN
 * @since 2023-10-30
 */
@Service
public class ZjStoreServiceImpl extends ServiceImpl<ZjStoreMapper, ZjStore> implements ZjStoreService {
    @Resource
    private ZjStoreMapper storeMapper;
    @Resource
    private ZjStorePositionService storePositionService;
    @Resource
    private ZjStoreInboundService storeInboundService;
    @Resource
    private ZjStoreOutboundService storeOutboundService;
    @Resource
    private ZjStoreInboundMaterialService storeInboundMaterialService;
    @Resource
    private ZjStoreOutboundMaterialService storeOutboundMaterialService;

    // 新增或修改仓库
    @Override
    public void save(Long custAccId, StoreVo storeVo) {
        Assert.isTrue(null == storeMapper.existByName(custAccId, storeVo.getId(), storeVo.getName()), "仓库名称 ["+ storeVo.getName()+"] 已重复");
        if (StringUtils.isNotBlank(storeVo.getStoreNo())) {
            Assert.isTrue(null == storeMapper.existByCode(custAccId, storeVo.getId(), storeVo.getStoreNo()), "仓库编码 ["+ storeVo.getStoreNo()+"] 已重复");
        }
        if (null == storeVo.getId() && storeVo.getEnableStorePosition() && CollectionUtil.isEmpty(storeVo.getStorePositionVos())) {
            Assert.isTrue(false, "当前仓库已启用仓位，必须添加至少一个仓位");
        }
        if (null != storeVo.getId()) {
            ZjStore store = this.getById(storeVo.getId());
            if (null != store && store.getEnableStorePosition() && CollectionUtil.isEmpty(storeVo.getStorePositionVos())) {
                Assert.isTrue(false, "当前仓库已启用仓位，必须添加至少一个仓位");
            }
        }
        if (CollectionUtil.isNotEmpty(storeVo.getDelStorePositionIds())) {
            storePositionService.deleteByIds(storeVo.getDelStorePositionIds());
        }
        ZjStore store = new ZjStore();
        BeanUtil.copyProperties(storeVo, store);
        store.setOutStoreType(null != store.getOutStore()? store.getOutStoreType(): 1);
        store.setDisabled(storeVo.getStatus());
        if (null != store.getId()) {
            this.updateById(store);
        } else {
            store.setId(IdWorker.getId());
            store.setCustAccId(custAccId);
            store.setCode(StringUtils.isNotBlank(storeVo.getStoreNo()) ? storeVo.getStoreNo() : RandomUtil.random8());
            this.save(store);
        }
        storePositionService.save(custAccId, store.getId(), storeVo.getStorePositionVos());
    }

    // 获取仓库列表本月的入/出库的数量
    @Override
    public Map<String, Object> getListCurrentMothInWidthOutStoreQty(Long custAccId) {
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("inStoreQty", storeInboundService.getListCurrentMothInWidthOutStoreQty(custAccId));
        resultMap.put("outStoreQty", storeOutboundService.getListCurrentMothInWidthOutStoreQty(custAccId));
        return resultMap;
    }

    // 获取仓库列表
    @Override
    public List<ZjStore> getList(Long custAccId, StoreSelectVo selectVo) {
        return storeMapper.getList(custAccId, selectVo);
    }

    // 获取仓库列表总记录数
    @Override
    public long getListCount(Long custAccId, StoreSelectVo selectVo) {
        return storeMapper.getListCount(custAccId, selectVo);
    }

    // 根据仓库ID获取仓库详情
    @Override
    public StoreVo getDetail(Long id) {
        ZjStore store = this.getById(id);
        Assert.isTrue(null != store, "仓库ID参数["+ id +"]的仓库数据不存在");

        StoreVo vo = new StoreVo();
        BeanUtil.copyProperties(store, vo);
        vo.setStatus(store.getDisabled());
        vo.setStoreNo(store.getCode());
        vo.setCreateTime(store.getGmtCreate());
        vo.setUpdateTime(store.getGmtUpdate());
        List<ZjStorePosition> positionList = storePositionService.getByStoreId(id);
        vo.setStorePositionVos(positionList.stream().map(po -> {
            return new StorePositionVo(po.getId(), po.getName(), po.getDisabled());
        }).toList());
        return vo;
    }

    // 批量启用或禁用仓库
    @Override
    public void updateDisabledBatchById(List<Long> ids, boolean status) {
        if (CollectionUtil.isEmpty(ids)) {
            return;
        }
        storeMapper.updateDisabledBatchById(ids, status);
    }

    // 批量修改允许或不允许负库存
    @Override
    public void updateCanNegativeStockBatchById(List<Long> ids, boolean canNegativeStock) {
        if (CollectionUtil.isEmpty(ids)) {
            return;
        }
        storeMapper.updateCanNegativeStockBatchById(ids, canNegativeStock);
    }

    // 根据仓库ID获取仓库名称
    @Override
    public List<ZjStore> getStoreNameByIds(List<Long> ids) {
        if (CollectionUtil.isEmpty(ids)) {
            return new ArrayList<>();
        }
        QueryWrapper<ZjStore> wrapper = new QueryWrapper<>();
        wrapper.select("id", "name", "is_enable_store_position AS enableStorePosition", "is_can_negative_stock AS canNegativeStock");
        wrapper.in("id", ids);
        return this.list(wrapper);
    }

    // 获取服务商个人仓列表
    @Override
    public List<ZjStore> getNetworkMobileStoreList(Long custAccId, Long networkId, Long networkEmpId, SelectVo selectVo) {
        return storeMapper.getNetworkMobileStoreList(custAccId, networkId, networkEmpId, selectVo);
    }

    // 获取服务商个人仓列表总记录数
    @Override
    public long getNetworkMobileStoreListCount(Long custAccId, Long networkId, Long networkEmpId, SelectVo selectVo) {
        return storeMapper.getNetworkMobileStoreListCount(custAccId, networkId, networkEmpId, selectVo);
    }
}
